package Views.Movimiento;

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.List;

import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.SwingConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import javax.swing.JScrollPane;

import Fisica.DAOCompra;
import Fisica.DAOExtencion;
import Fisica.DAOPadron;
import Fisica.DAOTarjeta;
import Fisica.DAOTicket;
import Inteface.InterfaceGrilla;
import Inteface.InterfacePanel;
import Logica.Util;
import Modelo.CtaCte_Padron;
import Modelo.Fac_Ventas;
import Modelo.Tarjeta;
import Modelo.TarjetaCompra;
import Modelo.TarjetaExtencion;

import javax.swing.JTextField;

public class MovimientosGrilla extends JPanel implements InterfaceGrilla, InterfacePanel{
	private JTable table;

	public DefaultTableModel model;
	private TableRowSorter<TableModel> modeloOrdenado;
	/**Atributos de alinear tablas*/
	public DefaultTableCellRenderer alinearCentro;
	private JTextField tfFiltro;
	
	/**
	 * Create the panel.
	 */
	public MovimientosGrilla(int id) {
		setLayout(null);
		this.setVisible(true);
		JScrollPane scrollPane = new JScrollPane();
		
		scrollPane.setBounds(10, 11, 800, 338);
//		scrollPane.setBounds(10, 11, 580, 407);
		add(scrollPane);
		
		table = new JTable();
		scrollPane.setViewportView(table);
		
		tfFiltro = new JTextField();
		tfFiltro.setBounds(10, 398, 120, 20);
		add(tfFiltro);
		tfFiltro.setColumns(10);

		
		this.alinear(); //en el constructor de la clase.

		this.init(id);
		this.autoFiltro();
	}
	
	public void init(int id){
	  
	   model = new DefaultTableModel(
				new Object[][] {
						{null, null, null, null},
						{null, null, null, null},
						{null, null, null, null},
						{null, null, null, null},
					},
					new String[] {
						"Tarjeta", "Cliente", "Puntos", "Importe"
					}
				) {
					Class[] columnTypes = new Class[] {
						String.class, String.class, String.class, String.class
					};
					public Class getColumnClass(int columnIndex) {
						return columnTypes[columnIndex];
					}
				};		
				
		table.setModel(model);
		table.getColumnModel().getColumn(0).setPreferredWidth(50);
//		table.getColumnModel().getColumn(0).setMaxWidth(50);
		table.getColumnModel().getColumn(1).setMinWidth(70);
//		table.getColumnModel().getColumn(1).setMaxWidth(100);
		table.getColumnModel().getColumn(2).setPreferredWidth(80);
		table.getColumnModel().getColumn(2).setMinWidth(80);
//		table.getColumnModel().getColumn(2).setMaxWidth(100);
		table.getColumnModel().getColumn(3).setPreferredWidth(50);
		table.getColumnModel().getColumn(3).setMinWidth(50);
//		table.getColumnModel().getColumn(3).setMaxWidth(80);
//		table.getColumnModel().getColumn(4).setPreferredWidth(50);
//		table.getColumnModel().getColumn(4).setMinWidth(50);
//		table.getColumnModel().getColumn(4).setMaxWidth(100);
//		table.getColumnModel().getColumn(5).setPreferredWidth(50);
//		table.getColumnModel().getColumn(5).setMinWidth(50);
//		table.getColumnModel().getColumn(5).setMaxWidth(80);
//		table.getColumnModel().getColumn(6).setPreferredWidth(60);
//		table.getColumnModel().getColumn(6).setMinWidth(60);
//		table.getColumnModel().getColumn(6).setMaxWidth(250);
//		table.getColumnModel().getColumn(7).setPreferredWidth(60);
//		table.getColumnModel().getColumn(7).setMinWidth(60);
//		table.getColumnModel().getColumn(7).setMaxWidth(150);
		
		List<Object>list = null;
		DAOCompra dm = new DAOCompra();
		DAOTarjeta dt = new DAOTarjeta();
		DAOPadron dp = new DAOPadron();
		DAOExtencion de = new DAOExtencion();
		DAOTicket dtic = new DAOTicket();
		
		list = dm.getList();
		
		if(list.size()>0 ){
			model.setRowCount(0);
			Fac_Ventas fv;
			TarjetaExtencion e;
			CtaCte_Padron p;
			Tarjeta t;
			TarjetaCompra c;
			String nombre;
			for (Object x : list) {
				c = (TarjetaCompra) x;
				t = (Tarjeta) dt.get(c.getId_tarjeta());
				
				if(t.getExtencion().equals("N")){
					p = (CtaCte_Padron) dp.get(t.getPadron_codigo());
					nombre = p.getPadron_apelli()+", "+p.getPadron_nombre();
				}else{
					e = (TarjetaExtencion)de.get(t.getId());
					nombre = e.getApellido()+", "+e.getNombre();
				}
				fv = (Fac_Ventas)dtic.get("CIERRE", Util.getDate(c.getFecha()), Integer.parseInt(c.getNro_ticket()));

				model.addRow(new Object[] {
//				       "Tarjeta",     "Cliente", "Puntos",   "Importe"
						t.getNumero(), nombre, c.getPuntos(), fv.getBonificacion()
						});
			}
		}
        
		table.getColumnModel().getColumn(0).setCellRenderer(alinearCentro);
		table.getColumnModel().getColumn(1).setCellRenderer(alinearCentro);
		table.getColumnModel().getColumn(2).setCellRenderer(alinearCentro);
		table.getColumnModel().getColumn(3).setCellRenderer(alinearCentro);
		
		if(list.size()>0 && id >= 0){
			table.setSelectionMode(id);
		}
		
	}

    
    private void filtrar(ActionEvent e) {
        //codigo de filtro
    	modeloOrdenado = new TableRowSorter(model);
        String fil = tfFiltro.getText().toUpperCase();
        //filtrar todas las filas que tengan el textro "fil"
        if (fil.length() != 0){
                modeloOrdenado.setRowFilter (RowFilter.regexFilter(".*"+fil+"*."));
        }else{
                modeloOrdenado.setRowFilter (RowFilter.regexFilter(""));                
        }
        table.setRowSorter (modeloOrdenado);       
    }
    
    private void autoFiltro(){
        tfFiltro.addKeyListener(new KeyListener() {			
			@Override
			public void keyTyped(KeyEvent arg0) {
				}
			
			@Override
			public void keyReleased(KeyEvent arg0) {
				filtrar(null);
			}
			
			@Override
			public void keyPressed(KeyEvent arg0) {
				}
		});
        }
    
	public int getRowSelected() {
		try {
			return table.getSelectedRow();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return -1;
	}

	public void guardar() {

	}

	public void cancelar() {
		this.init(-1);		
	}

	public Object primero() {
//		DAOMovimiento dt = new DAOMovimiento();
//		return (Movimiento) dt.getFirst();	
		return null;
	}

	public Object ultimo() {
//		DAOMovimiento dt = new DAOMovimiento();
//		return (Movimiento) dt.getLast();
		return null;
	}

	public Object anterior() {
//		DAOMovimiento dt = new DAOMovimiento();
//		int row = table.getSelectedRow();
//		int id = Integer.parseInt((String) table.getValueAt(row-1, 0));
//		return (Movimiento) dt.getPre(id);
		return null;
	}

	public Object posterior() {
//		DAOMovimiento dt = new DAOMovimiento();
//		int row = table.getSelectedRow();
//		int id = Integer.parseInt((String) table.getValueAt(row +1, 0));
//		return (Movimiento) dt.getPost(id);
		return null;
	}

	public boolean grilla() {
		return true;		
	}

	public boolean campos() {
		return false;		
	}

	@Override
	public int getPanel() {
		return 7;
	}

	@Override
	public void nuevo() {
//		DAOMovimiento dt = new DAOMovimiento();
//		int i = ((Movimiento) dt.getLast()).getId() +1;
//		int col = model.getColumnCount();
//		int row = model.getRowCount() -1;
//		boolean tiene = false;
//		for (int x = 1; x< col; x++) {
//			Object campo = model.getValueAt(row, x);
//			if((campo != null))
//				tiene = true;
//		}
//		if(tiene)
//			model.addRow(new Object[] {i, null, null, null, null, null});
		
	}
	
	

	

	/*Inicializo y cargo alineacinn de conlumnas en tablas*/
		public void alinear(){
			alinearCentro = new DefaultTableCellRenderer();					
			alinearCentro.setHorizontalAlignment(SwingConstants.CENTER);			
		}

		@Override
		public int setprimero() {
			table.setRowSelectionInterval( 0, 0 );
			return Integer.parseInt((String)table.getValueAt(0, 0));
		}

		@Override
		public int setultimo() {
			int rows = model.getRowCount();
			table.setRowSelectionInterval( rows-1, rows-1 );
			return Integer.parseInt((String)table.getValueAt(rows-1, 0));
		}

		@Override
		public int setanterior() {
			int row = table.getSelectedRow();
			if(row > 0)
				table.setRowSelectionInterval( row-1, row-1 );
			else return setprimero();
			return (Integer.parseInt((String)table.getValueAt(row-1, 0)));
		}

		@Override
		public int setposterior() {
			int row = table.getSelectedRow();
			if(row >= (table.getRowCount()-1))
				return setultimo();
			else
				table.setRowSelectionInterval( row+1, row+1 );
			return Integer.parseInt((String)table.getValueAt(row+1, 0));
		}
}
